Computer graphics is the art and science of generating pictures, images, or other graphical or pictorial information with a computer. Generation of the pictures or images is commonly called rendering. Generally, in three-dimensional (3D) computer graphics, geometry that represents surfaces (or volumes) of objects in a scene is translated into pixels (picture elements), stored in a frame buffer, and then displayed on a display device.
One rendering mechanism involves use of a graphics system comprising multiple graphics processors (e.g., graphics processing units or GPUs) with associated frame buffers. Each GPU and associated frame buffer is responsible for rendering a designated time sequence or portion of the picture or image on a designated portion of the display. For instance, a sky scene may be rendered from four frame buffers, with the final display rendering typically under the control of one of the graphics processors (herein, referred to as a display controller).
Various techniques may be employed to coordinate rendering by multiple GPUs. One technique is referred to as split frame rendering, and involves dividing the rendering into even and odd frames. For example, one GPU is responsible for even frames rendering, another GPU for odd frames rendering. In another type of split frame rendering technique, one GPU may be responsible for rendering a lower picture of the display and another GPU may be responsible for rendering an upper portion of the display. Another technique conventionally employed involves dividing the job between multiple GPUs in the time domain, often referred to as alternate frame rendering.
Such arrangements for rendering pictures or images are not without challenges. One challenge involves synchronization. For instance, with regard to split frame rendering, the final display comprises rendered images from multiple frame buffers. Thus, the rendering of the final display may not commence until processing is complete for each respective frame buffer.
Another challenge involves determining how to share memory. For instance, particular texture processing can be determined at the application level by a host processor (e.g., central processing unit or CPU), at the front end of a graphics processor (e.g., by a vertex shader program generating texture type data maps), or can be implemented in a post-processing manner (e.g., by pixel shader generation of a post-processing image rendered in the master controller frame buffer). In the latter cases, rendering occurs to a local GPU (frame) buffer and this rendered texture surface can be shared among multiple GPUs, which should be able to fetch and filter samples for portions of the image split among several graphics processing units. Retrieving the desired texture data from the respective buffers needs to be synchronized with end of texture rendering. Otherwise read-after write (RAW) hazards may occur when one GPU start to read a surface that is still being rendered by another GPU.